package classic

/**
 * 给定一个整数数组 nums，将数组中的元素向右轮转 k 个位置，其中 k 是非负数。
 *
 * 示例1：
 * 输入: nums = [1,2,3,4,5,6,7], k = 3
 * 输出: [5,6,7,1,2,3,4]
 * 解释:
 * 向右轮转 1 步: [7,1,2,3,4,5,6]
 * 向右轮转 2 步: [6,7,1,2,3,4,5]
 * 向右轮转 3 步: [5,6,7,1,2,3,4]
 *
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode.cn/problems/rotate-array
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */
fun rotate(nums: IntArray, k: Int): Unit {
    val turn = k % nums.size
    nums.reverse()
    nums.reverse(0, turn)
    nums.reverse(turn, nums.size)
}

fun IntArray.reverse(from: Int, to: Int) {
    if (this.size <= from || from < 0 || to < 0 || to > this.size || from >= to) return
    var left = from
    var right = to - 1
    while (left < right) {
        this[left] = this[right].also { this[right] = this[left] }
        ++left
        --right
    }
}

fun main() {
    val arrays = intArrayOf(1, 2, 3, 4, 5, 6, 7)
    rotate(arrays, 3)
    println(arrays.contentToString())
}
